package xyz.sekai52799.answer.a401_a600;

import java.util.Arrays;

public class Question556 {
//    给你一个正整数n ，请你找出符合条件的最小整数，其由重新排列 n 中存在的每位数字组成，并且其值大于 n 。如果不存在这样的正整数，则返回 -1 。
//
//    注意 ，返回的整数应当是一个 32 位整数 ，如果存在满足题意的答案，但不是 32 位整数 ，同样返回 -1 。
//
//
//
//    示例 1：
//
//    输入：n = 12
//    输出：21
//    示例 2：
//
//    输入：n = 21
//    输出：-1
//
//
//    提示：
//
//            1 <= n <= 231 - 1
//
//    来源：力扣（LeetCode）
//    链接：https://leetcode.cn/problems/next-greater-element-iii
//    著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

    public static int nextGreaterElement(int n) {
        // 转成char数组
        String s = String.valueOf(n);
        char[] chars = s.toCharArray();

        // 如果只有一个元素，就一定不会有更大的，直接返回-1
        if (chars.length < 2) return -1;

        // 如果所有前一位的数都比后一位的大，也不会有更大的数，返回-1
        boolean isExist = false;
        for (int i = 0;i < chars.length - 1;i++){
            if (chars[i] < chars[i+1]){
                isExist = true;
                break;
            }
        }
        if (!isExist) {
            return -1;
        }

        // 得到最后一位  "后面一位比自己大的数" 的位置
        int special = 0;
        for (int i = 0;i < chars.length - 1;i++){
            if (chars[i] < chars[i+1]){
                special = i;
            }
        }
        // 找到在special后面的比chars[special]大的  最小的一个数所在的位置
        int bigger = 0;
        int smallMax = Integer.MAX_VALUE;
        for (int i = special;i < chars.length;i++){
            int i1 = Integer.parseInt(String.valueOf(chars[i]));
            if (chars[special] < chars[i] && i1 < smallMax){
                smallMax = i1;
                bigger = i;
            }
        }

        char temp;
        temp = chars[special];
        chars[special] = chars[bigger];
        chars[bigger] = temp;

        Arrays.sort(chars, special + 1, chars.length);

        StringBuilder stringBuilder = new StringBuilder();
        for (char c : chars){
            stringBuilder.append(c);
        }
        long aLong = Long.parseLong(stringBuilder.toString());
        return aLong <= (long) Integer.MAX_VALUE ? Math.toIntExact(aLong) : -1;
    }
}
